﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using BE;
using BE.SearchCriteria;

namespace DAL
{
    public class CampañaDAL : BaseDAL
    {
        public List<CampañaBE> SeleccionarPorParametros(BaseSC pCampañaSC, int? pPageSize, int? pPageNum, ref int pCountReg)
        {
            CampañaSC wCampañaSC = (CampañaSC)pCampañaSC;
            if (wCampañaSC == null)
                wCampañaSC = new CampañaSC();

            List<CampañaBE> listaDeCampañas = null;
            using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
            {
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add(new SqlParameter("@IdCampaña", wCampañaSC.IdCampaña));
                cmd.Parameters.Add(new SqlParameter("@Descripcion", wCampañaSC.Descripcion));
                cmd.Parameters.Add(new SqlParameter("@Año", wCampañaSC.Año));
                cmd.Parameters.Add(new SqlParameter("@AñoDesde", wCampañaSC.AñoDesde));
                cmd.Parameters.Add(new SqlParameter("@AñoHasta", wCampañaSC.AñoHasta));
                cmd.Parameters.Add(new SqlParameter("@Cerrado", wCampañaSC.Cerrado));
                cmd.Parameters.Add(new SqlParameter("@PageSize", pPageSize));
                cmd.Parameters.Add(new SqlParameter("@PageNum", pPageNum));

                SqlParameter p = new SqlParameter();
                p.ParameterName = "@PageCount";
                p.Direction = ParameterDirection.Output;
                p.SqlDbType = SqlDbType.Int;
                cmd.Parameters.Add(p);

                cmd.CommandText = "Campañas_GetAllPaginated";
                cnn.Open();
                SqlDataReader reader = null;
                reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {
                    listaDeCampañas = new List<CampañaBE>();

                    while (reader.Read())
                    {
                        listaDeCampañas.Add(Construir(reader));
                    }
                }

                reader.Close();
                pCountReg = (Int32)cmd.Parameters["@PageCount"].Value;
            }
            return listaDeCampañas;
        }

        private CampañaBE Construir(SqlDataReader pReader)
        {
            CampañaBE oCampaña = new CampañaBE();

            oCampaña.IdCampaña = Convert.ToInt32(pReader["IdCampaña"]);
            oCampaña.Descripcion = Convert.ToString(pReader["Descripcion"]);
            oCampaña.Año = Convert.ToInt32(pReader["Año"]);
            if (pReader["Cerrado"] != DBNull.Value)
                oCampaña.Cerrado = Convert.ToBoolean(pReader["Cerrado"]);

            return oCampaña;
        }

        public CampañaBE SeleccionarPorId(CampañaBE oCampañaBE)
        {
            CampañaBE oCampaña = null;
            using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
            {
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add(new SqlParameter("@IdCampaña", oCampañaBE.IdCampaña));
                cmd.CommandText = "Campañas_GetById";
                cnn.Open();
                SqlDataReader reader = null;
                reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {
                    while (reader.Read())
                    {                        
                        oCampaña = Construir(reader);
                    }
                }

            }
            return oCampaña;
        }

        public void Insertar(CampañaBE Campaña)
        {
            using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
            {
                try
                {
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = cnn;
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = "Campañas_i";
                    cmd.Parameters.Add(new SqlParameter("@Descripcion", Campaña.Descripcion));
                    cmd.Parameters.Add(new SqlParameter("@Año", Campaña.Año));

                    SqlParameter p = new SqlParameter();
                    p.ParameterName = "@IdCampaña";
                    p.Direction = ParameterDirection.Output;
                    p.SqlDbType = SqlDbType.Int;
                    cmd.Parameters.Add(p);

                    cnn.Open();
                    cmd.ExecuteNonQuery();
                    Campaña.IdCampaña = (Int32)cmd.Parameters["@IdCampaña"].Value;
                }
                catch (Exception)
                {
                    throw;
                }

            }
        }

        public void Modificar(CampañaBE pCampaña)
        {
            try
            {
                using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
                {
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = cnn;
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = "Campañas_u";
                    cmd.Parameters.Add(new SqlParameter("@IdCampaña", pCampaña.IdCampaña));
                    cmd.Parameters.Add(new SqlParameter("@Descripcion", pCampaña.Descripcion));
                    cmd.Parameters.Add(new SqlParameter("@Año", pCampaña.Año));
                    cnn.Open();
                    cmd.ExecuteNonQuery();
                }
            }
            catch (Exception)
            { throw; }
        }

        public void Delete(CampañaBE pCampaña)
        {
            try
            {
                using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
                {
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = cnn;
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = "Campañas_d";
                    cmd.Parameters.Add(new SqlParameter("@IdCampaña", pCampaña.IdCampaña));
                    cnn.Open();
                    cmd.ExecuteNonQuery();
                }
            }
            catch (Exception)
            { throw; }
        }

        public void Cerrar(CampañaBE pCampaña)
        {
            try
            {
                using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
                {
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = cnn;
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = "CerrarCampaña_u";
                    cmd.Parameters.Add(new SqlParameter("@IdCampaña", pCampaña.IdCampaña));                    
                    cnn.Open();
                    cmd.ExecuteNonQuery();
                }
            }
            catch (Exception)
            { throw; }
        }
    }
}
